Micron Document
🌎 rns.kin.earth git 🌍

Node / dev / reticulum / files / RNS / Utilities / rncp.py

Displaying Raw β€’ Download

RNS/Utilities/rncp.py 131dbd28131acafa896a5d6bdac09fb55dbf37ab (131dbd28) Text, 31.23 KB

T8b949e#!/usr/bin/env python3

T8b949e# MIT License
T8b949e#
T8b949e# Copyright (c) 2016-2022 Mark Qvist / unsigned.io
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# The above copyright notice and this permission notice shall be included in all
T8b949e# copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.

Tff7b72import T7ee787RNS
Tff7b72import T7ee787argparse
Tff7b72import T7ee787threading
Tff7b72import T7ee787time
Tff7b72import T7ee787sys
Tff7b72import T7ee787os

Tff7b72from T7ee787RNST7ee787.T7ee787_version Tff7b72import Te6edf3__version__

Te6edf3APP_NAME Tff7b72= Ta5d6ff"Ta5d6ffrncpTa5d6ff"
Te6edf3allow_all Tff7b72= Tff7b72False
Te6edf3allow_fetch Tff7b72= Tff7b72False
Te6edf3fetch_jail Tff7b72= Tff7b72None
Te6edf3allowed_identity_hashes Tff7b72= Tb4b4b4[Tb4b4b4]

Te6edf3REQ_FETCH_NOT_ALLOWED Tff7b72= T79c0ff0xF0

Tff7b72def Td2a8fflistenTb4b4b4(Te6edf3configdirTb4b4b4, Te6edf3verbosity Tff7b72= T79c0ff0Tb4b4b4, Te6edf3quietness Tff7b72= T79c0ff0Tb4b4b4, Te6edf3allowed Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4, Te6edf3display_identity Tff7b72= Tff7b72FalseTb4b4b4,
Te6edf3limit Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3disable_auth Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3fetch_allowed Tff7b72= Tff7b72FalseTb4b4b4, Te6edf3jail Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3announce Tff7b72= Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3allow_allTb4b4b4, Te6edf3allow_fetchTb4b4b4, Te6edf3allowed_identity_hashesTb4b4b4, Te6edf3fetch_jail
Tff7b72from T7ee787tempfile Tff7b72import Te6edf3TemporaryFile

Te6edf3allow_fetch Tff7b72= Te6edf3fetch_allowed
Te6edf3identity Tff7b72= Tff7b72None
Tff7b72if Te6edf3announce Tff7b72< T79c0ff0Tb4b4b4:
Te6edf3announce Tff7b72= Tff7b72False

Te6edf3targetloglevel Tff7b72= T79c0ff3Tff7b72+Te6edf3verbosityTff7b72-Te6edf3quietness
Te6edf3reticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdirTff7b72=Te6edf3configdirTb4b4b4, Te6edf3loglevelTff7b72=Te6edf3targetloglevelTb4b4b4)

Tff7b72if Te6edf3jail Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3fetch_jail Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3jailTb4b4b4)Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRestricting fetch requests to paths under Tffea00\"Ta5d6ff"Tff7b72+Te6edf3fetch_jailTff7b72+Ta5d6ff"Tffea00\"Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)

Te6edf3identity_path Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffidentitypathTff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Te6edf3APP_NAME
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3identity_pathTb4b4b4)Tb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3identity_pathTb4b4b4)

Tff7b72if Te6edf3identity Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo valid saved identity found, creating new...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4)
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3identityTff7b72.Td2a8ffto_fileTb4b4b4(Te6edf3identity_pathTb4b4b4)

Te6edf3destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Te6edf3identityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffreceiveTa5d6ff"Tb4b4b4)

Tff7b72if Te6edf3display_identityTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffIdentity : Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3identityTb4b4b4)Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffListening on : Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destinationTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)

Tff7b72if Te6edf3disable_authTb4b4b4:
Te6edf3allow_all Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Te6edf3dest_len Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Tff7b72tryTb4b4b4:
Te6edf3allowed_file_name Tff7b72= Ta5d6ff"Ta5d6ffallowed_identitiesTa5d6ff"
Te6edf3allowed_file Tff7b72= Tff7b72None
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Ta5d6ff"Ta5d6ff/etc/rncp/Ta5d6ff"Tff7b72+Te6edf3allowed_file_nameTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3allowed_file Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Ta5d6ff"Ta5d6ff/etc/rncp/Ta5d6ff"Tff7b72+Te6edf3allowed_file_nameTb4b4b4)
Tff7b72elif Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Ta5d6ff"Ta5d6ff~/.config/rncp/Ta5d6ff"Tff7b72+Te6edf3allowed_file_nameTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3allowed_file Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Ta5d6ff"Ta5d6ff~/.config/rncp/Ta5d6ff"Tff7b72+Te6edf3allowed_file_nameTb4b4b4)
Tff7b72elif Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Ta5d6ff"Ta5d6ff~/.rncp/Ta5d6ff"Tff7b72+Te6edf3allowed_file_nameTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3allowed_file Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Ta5d6ff"Ta5d6ff~/.rncp/Ta5d6ff"Tff7b72+Te6edf3allowed_file_nameTb4b4b4)
Tff7b72if Te6edf3allowed_file Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3af Tff7b72= Tffa657openTb4b4b4(Te6edf3allowed_fileTb4b4b4, Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4)
Te6edf3al Tff7b72= Te6edf3afTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3ali Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3a Tff7b72in Te6edf3alTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3aTb4b4b4) Tff7b72== Te6edf3dest_lenTb4b4b4:
Te6edf3aliTff7b72.Td2a8ffappendTb4b4b4(Te6edf3aTb4b4b4)

Tff7b72if Tffa657lenTb4b4b4(Te6edf3aliTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3allowedTb4b4b4:
Te6edf3allowed Tff7b72= Te6edf3ali
Tff7b72elseTb4b4b4:
Te6edf3allowedTff7b72.Td2a8ffextendTb4b4b4(Te6edf3aliTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3aliTb4b4b4) Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3ms Tff7b72= Ta5d6ff"Ta5d6ffyTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3ms Tff7b72= Ta5d6ff"Ta5d6ffiesTa5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLoaded Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3aliTb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff allowed identitTa5d6ff"Tff7b72+Te6edf3msTff7b72+Ta5d6ff"Ta5d6ff from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3allowed_fileTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while parsing allowed_identities file. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72if Te6edf3allowed Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72for Te6edf3a Tff7b72in Te6edf3allowedTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3aTb4b4b4) Tff7b72!= Te6edf3dest_lenTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffAllowed destination length is invalid, must be Tffd700{hex}Ta5d6ff hexadecimal characters (Tffd700{byte}Ta5d6ff bytes).Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tffa657hexTff7b72=Te6edf3dest_lenTb4b4b4, Te6edf3byteTff7b72=Te6edf3dest_lenTff7b72/Tff7b72/T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3destination_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3aTb4b4b4)
Te6edf3allowed_identity_hashesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination entered. Check your input.Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)

Tff7b72if Tffa657lenTb4b4b4(Te6edf3allowed_identity_hashesTb4b4b4) Tff7b72< T79c0ff1 Tff7b72and Tff7b72not Te6edf3disable_authTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffWarning: No allowed identities configured, rncp will not accept any files!Ta5d6ff"Tb4b4b4)

Tff7b72def Td2a8fffetch_requestTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3link_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_atTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3allow_fetchTb4b4b4, Te6edf3fetch_jail
Tff7b72if Tff7b72not Te6edf3allow_fetchTb4b4b4:
Tff7b72return Te6edf3REQ_FETCH_NOT_ALLOWED

Te6edf3file_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3fetch_jailTb4b4b4:
Tff7b72if Tff7b72not Te6edf3file_pathTff7b72.Td2a8ffstartswithTb4b4b4(Te6edf3jailTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3REQ_FETCH_NOT_ALLOWED

Te6edf3target_link Tff7b72= Tff7b72None
Tff7b72for Te6edf3link Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffactive_linksTb4b4b4:
Tff7b72if Te6edf3linkTff7b72.Td2a8fflink_id Tff7b72== Te6edf3link_idTb4b4b4:
Te6edf3target_link Tff7b72= Te6edf3link

Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3file_pathTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffClient-requested file not found: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3file_pathTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3target_link Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSending file Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3file_pathTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff to clientTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)

Te6edf3temp_file Tff7b72= Te6edf3TemporaryFileTb4b4b4(Tb4b4b4)
Te6edf3real_file Tff7b72= Tffa657openTb4b4b4(Te6edf3file_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Te6edf3filename_bytes Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffbasenameTb4b4b4(Te6edf3file_pathTb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3filename_len Tff7b72= Tffa657lenTb4b4b4(Te6edf3filename_bytesTb4b4b4)

Tff7b72if Te6edf3filename_len Tff7b72> T79c0ff0xFFFFTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffFilename exceeds max size, cannot sendTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)

Te6edf3temp_fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3filename_lenTff7b72.Td2a8ffto_bytesTb4b4b4(T79c0ff2Tb4b4b4, Ta5d6ff"Ta5d6ffbigTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3temp_fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3filename_bytesTb4b4b4)
Te6edf3temp_fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3real_fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3temp_fileTff7b72.Td2a8ffseekTb4b4b4(T79c0ff0Tb4b4b4)

Te6edf3fetch_resource Tff7b72= Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Te6edf3temp_fileTb4b4b4, Te6edf3target_linkTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72None


Te6edf3destinationTff7b72.Td2a8ffset_link_established_callbackTb4b4b4(Te6edf3client_link_establishedTb4b4b4)
Te6edf3destinationTff7b72.Td2a8ffregister_request_handlerTb4b4b4(Ta5d6ff"Ta5d6fffetch_fileTa5d6ff"Tb4b4b4, Te6edf3response_generatorTff7b72=Te6edf3fetch_requestTb4b4b4, Te6edf3allowTff7b72=Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_LISTTb4b4b4, Te6edf3allowed_listTff7b72=Te6edf3allowed_identity_hashesTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffrncp listening on Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destinationTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4)

Tff7b72if Te6edf3announce Tff7b72>Tff7b72= T79c0ff0Tb4b4b4:
Tff7b72def Td2a8ffjobTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3destinationTff7b72.Td2a8ffannounceTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3announce Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72while Tff7b72TrueTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3announceTb4b4b4)
Te6edf3destinationTff7b72.Td2a8ffannounceTb4b4b4(Tb4b4b4)

Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72while Tff7b72TrueTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff1Tb4b4b4)

Tff7b72def Td2a8ffclient_link_establishedTb4b4b4(Te6edf3linkTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffIncoming link establishedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_remote_identified_callbackTb4b4b4(Te6edf3receive_sender_identifiedTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_strategyTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACCEPT_APPTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_callbackTb4b4b4(Te6edf3receive_resource_callbackTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_started_callbackTb4b4b4(Te6edf3receive_resource_startedTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_concluded_callbackTb4b4b4(Te6edf3receive_resource_concludedTb4b4b4)

Tff7b72def Td2a8ffreceive_sender_identifiedTb4b4b4(Te6edf3linkTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3allow_all

Tff7b72if Te6edf3identityTff7b72.Td2a8ffhash Tff7b72in Te6edf3allowed_identity_hashesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAuthenticated senderTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3allow_allTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSender not allowed, tearing down linkTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72pass

Tff7b72def Td2a8ffreceive_resource_callbackTb4b4b4(Te6edf3resourceTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3allow_all
Te6edf3sender_identity Tff7b72= Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffget_remote_identityTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3sender_identity Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3sender_identityTff7b72.Td2a8ffhash Tff7b72in Te6edf3allowed_identity_hashesTb4b4b4:
Tff7b72return Tff7b72True

Tff7b72if Te6edf3allow_allTb4b4b4:
Tff7b72return Tff7b72True

Tff7b72return Tff7b72False

Tff7b72def Td2a8ffreceive_resource_startedTb4b4b4(Te6edf3resourceTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffget_remote_identityTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3id_str Tff7b72= Ta5d6ff"Ta5d6ff from Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3resourceTff7b72.Td2a8fflinkTff7b72.Td2a8ffget_remote_identityTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhashTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3id_str Tff7b72= Ta5d6ff"Ta5d6ff"

Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffStarting resource transfer Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffhashTb4b4b4)Tff7b72+Te6edf3id_strTb4b4b4)

Tff7b72def Td2a8ffreceive_resource_concludedTb4b4b4(Te6edf3resourceTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3resourceTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff completedTa5d6ff"Tb4b4b4)

Tff7b72if Te6edf3resourceTff7b72.Td2a8fftotal_size Tff7b72> T79c0ff4Tb4b4b4:
Te6edf3filename_len Tff7b72= Tffa657intTff7b72.Td2a8fffrom_bytesTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffdataTff7b72.Td2a8ffreadTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffbigTa5d6ff"Tb4b4b4)
Te6edf3filename Tff7b72= Te6edf3resourceTff7b72.Td2a8ffdataTff7b72.Td2a8ffreadTb4b4b4(Te6edf3filename_lenTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)

Te6edf3counter Tff7b72= T79c0ff0
Te6edf3saved_filename Tff7b72= Te6edf3filename
Tff7b72while Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3saved_filenameTb4b4b4)Tb4b4b4:
Te6edf3counter Tff7b72+Tff7b72= T79c0ff1
Te6edf3saved_filename Tff7b72= Te6edf3filenameTff7b72+Ta5d6ff"Ta5d6ff.Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3counterTb4b4b4)
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Te6edf3saved_filenameTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffdataTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)

Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffInvalid data received, ignoring resourceTa5d6ff"Tb4b4b4)

Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffResource failedTa5d6ff"Tb4b4b4)

Te6edf3resource_done Tff7b72= Tff7b72False
Te6edf3current_resource Tff7b72= Tff7b72None
Te6edf3stats Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3speed Tff7b72= T79c0ff0.0
Tff7b72def Td2a8ffsender_progressTb4b4b4(Te6edf3resourceTb4b4b4)Tb4b4b4:
Te6edf3stats_max Tff7b72= T79c0ff32
Tff7b72global Te6edf3current_resourceTb4b4b4, Te6edf3statsTb4b4b4, Te6edf3speedTb4b4b4, Te6edf3resource_done
Te6edf3current_resource Tff7b72= Te6edf3resource
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3got Tff7b72= Te6edf3current_resourceTff7b72.Td2a8ffget_progressTb4b4b4(Tb4b4b4)Tff7b72*Te6edf3current_resourceTff7b72.Td2a8fftotal_size
Te6edf3entry Tff7b72= Tb4b4b4[Te6edf3nowTb4b4b4, Te6edf3gotTb4b4b4]
Te6edf3statsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3entryTb4b4b4)
Tff7b72while Tffa657lenTb4b4b4(Te6edf3statsTb4b4b4) Tff7b72> Te6edf3stats_maxTb4b4b4:
Te6edf3statsTff7b72.Td2a8ffpopTb4b4b4(T79c0ff0Tb4b4b4)

Te6edf3span Tff7b72= Te6edf3now Tff7b72- Te6edf3statsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Te6edf3span Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3speed Tff7b72= T79c0ff0
Tff7b72elseTb4b4b4:
Te6edf3diff Tff7b72= Te6edf3got Tff7b72- Te6edf3statsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3speed Tff7b72= Te6edf3diffTff7b72/Te6edf3span

Tff7b72if Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72< Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Te6edf3resource_done Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Te6edf3resource_done Tff7b72= Tff7b72True

Te6edf3link Tff7b72= Tff7b72None
Tff7b72def Td2a8fffetchTb4b4b4(Te6edf3configdirTb4b4b4, Te6edf3verbosity Tff7b72= T79c0ff0Tb4b4b4, Te6edf3quietness Tff7b72= T79c0ff0Tb4b4b4, Te6edf3destination Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3file Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3timeout Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffPATH_REQUEST_TIMEOUTTb4b4b4, Te6edf3silentTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3current_resourceTb4b4b4, Te6edf3resource_doneTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3speed
Te6edf3targetloglevel Tff7b72= T79c0ff3Tff7b72+Te6edf3verbosityTff7b72-Te6edf3quietness

Tff7b72tryTb4b4b4:
Te6edf3dest_len Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Tff7b72if Tffa657lenTb4b4b4(Te6edf3destinationTb4b4b4) Tff7b72!= Te6edf3dest_lenTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffAllowed destination length is invalid, must be Tffd700{hex}Ta5d6ff hexadecimal characters (Tffd700{byte}Ta5d6ff bytes).Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tffa657hexTff7b72=Te6edf3dest_lenTb4b4b4, Te6edf3byteTff7b72=Te6edf3dest_lenTff7b72/Tff7b72/T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3destination_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3destinationTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination entered. Check your input.Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)

Te6edf3reticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdirTff7b72=Te6edf3configdirTb4b4b4, Te6edf3loglevelTff7b72=Te6edf3targetloglevelTb4b4b4)

Te6edf3identity_path Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffidentitypathTff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Te6edf3APP_NAME
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3identity_pathTb4b4b4)Tb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3identity_pathTb4b4b4)
Tff7b72if Te6edf3identity Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load identity for rncp. The identity file at Tffea00\"Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3identity_pathTb4b4b4)Tff7b72+Ta5d6ff"Tffea00\"Ta5d6ff may be corrupt or unreadable.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff2Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3identity Tff7b72= Tff7b72None

Tff7b72if Te6edf3identity Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo valid saved identity found, creating new...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4)
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3identityTff7b72.Td2a8ffto_fileTb4b4b4(Te6edf3identity_pathTb4b4b4)

Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Te6edf3silentTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPath to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff requestedTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPath to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff requested Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)

Te6edf3i Tff7b72= T79c0ff0
Te6edf3syms Tff7b72= Ta5d6ff"Ta5d6ffβ’„β’‚β’β‘β‘ˆβ‘β‘ Ta5d6ff"
Te6edf3estab_timeout Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72+Te6edf3timeout
Tff7b72while Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4) Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3estab_timeoutTb4b4b4:
Tff7b72if Tff7b72not Te6edf3silentTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tffa657printTb4b4b4(Tb4b4b4(Ta5d6ff"Tffea00\bTffea00\bTa5d6ff"Tff7b72+Te6edf3symsTb4b4b4[Te6edf3iTb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3i Tff7b72= Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72%Tffa657lenTb4b4b4(Te6edf3symsTb4b4b4)

Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3silentTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPath not foundTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffPath not foundTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3silentTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffEstablishing link with Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffEstablishing link with Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)

Te6edf3listener_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3listener_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(
Te6edf3listener_identityTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4,
Te6edf3APP_NAMETb4b4b4,
Ta5d6ff"Ta5d6ffreceiveTa5d6ff"
Tb4b4b4)

Te6edf3link Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3listener_destinationTb4b4b4)
Tff7b72while Te6edf3linkTff7b72.Td2a8ffstatus Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVE Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3estab_timeoutTb4b4b4:
Tff7b72if Tff7b72not Te6edf3silentTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tffa657printTb4b4b4(Tb4b4b4(Ta5d6ff"Tffea00\bTffea00\bTa5d6ff"Tff7b72+Te6edf3symsTb4b4b4[Te6edf3iTb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3i Tff7b72= Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72%Tffa657lenTb4b4b4(Te6edf3symsTb4b4b4)

Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3silentTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffCould not establish link with Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffCould not establish link with Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3silentTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffRequesting file from remote...Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffRequesting file from remote Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)

Te6edf3linkTff7b72.Td2a8ffidentifyTb4b4b4(Te6edf3identityTb4b4b4)

Te6edf3request_resolved Tff7b72= Tff7b72False
Te6edf3request_status Tff7b72= Ta5d6ff"Ta5d6ffunknownTa5d6ff"
Te6edf3resource_resolved Tff7b72= Tff7b72False
Te6edf3resource_status Tff7b72= Ta5d6ff"Ta5d6ffunrequestedTa5d6ff"
Te6edf3current_resource Tff7b72= Tff7b72None
Tff7b72def Td2a8ffrequest_responseTb4b4b4(Te6edf3request_receiptTb4b4b4)Tb4b4b4:
Tff7b72nonlocal Te6edf3request_resolvedTb4b4b4, Te6edf3request_status
Tff7b72if Te6edf3request_receiptTff7b72.Td2a8ffresponse Tff7b72== Tff7b72FalseTb4b4b4:
Te6edf3request_status Tff7b72= Ta5d6ff"Ta5d6ffnot_foundTa5d6ff"
Tff7b72elif Te6edf3request_receiptTff7b72.Td2a8ffresponse Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3request_status Tff7b72= Ta5d6ff"Ta5d6ffremote_errorTa5d6ff"
Tff7b72elif Te6edf3request_receiptTff7b72.Td2a8ffresponse Tff7b72== Te6edf3REQ_FETCH_NOT_ALLOWEDTb4b4b4:
Te6edf3request_status Tff7b72= Ta5d6ff"Ta5d6fffetch_not_allowedTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3request_status Tff7b72= Ta5d6ff"Ta5d6fffoundTa5d6ff"

Te6edf3request_resolved Tff7b72= Tff7b72True

Tff7b72def Td2a8ffrequest_failedTb4b4b4(Te6edf3request_receiptTb4b4b4)Tb4b4b4:
Tff7b72nonlocal Te6edf3request_resolvedTb4b4b4, Te6edf3request_status
Te6edf3request_status Tff7b72= Ta5d6ff"Ta5d6ffunknownTa5d6ff"
Te6edf3request_resolved Tff7b72= Tff7b72True

Tff7b72def Td2a8fffetch_resource_startedTb4b4b4(Te6edf3resourceTb4b4b4)Tb4b4b4:
Tff7b72nonlocal Te6edf3resource_status
Te6edf3current_resource Tff7b72= Te6edf3resource
Te6edf3current_resourceTff7b72.Td2a8ffprogress_callbackTb4b4b4(Te6edf3sender_progressTb4b4b4)
Te6edf3resource_status Tff7b72= Ta5d6ff"Ta5d6ffstartedTa5d6ff"

Tff7b72def Td2a8fffetch_resource_concludedTb4b4b4(Te6edf3resourceTb4b4b4)Tb4b4b4:
Tff7b72nonlocal Te6edf3resource_resolvedTb4b4b4, Te6edf3resource_status
Tff7b72if Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Tff7b72if Te6edf3resourceTff7b72.Td2a8fftotal_size Tff7b72> T79c0ff4Tb4b4b4:
Te6edf3filename_len Tff7b72= Tffa657intTff7b72.Td2a8fffrom_bytesTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffdataTff7b72.Td2a8ffreadTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffbigTa5d6ff"Tb4b4b4)
Te6edf3filename Tff7b72= Te6edf3resourceTff7b72.Td2a8ffdataTff7b72.Td2a8ffreadTb4b4b4(Te6edf3filename_lenTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)

Te6edf3counter Tff7b72= T79c0ff0
Te6edf3saved_filename Tff7b72= Te6edf3filename
Tff7b72while Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3saved_filenameTb4b4b4)Tb4b4b4:
Te6edf3counter Tff7b72+Tff7b72= T79c0ff1
Te6edf3saved_filename Tff7b72= Te6edf3filenameTff7b72+Ta5d6ff"Ta5d6ff.Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3counterTb4b4b4)
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Te6edf3saved_filenameTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3resourceTff7b72.Td2a8ffdataTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3resource_status Tff7b72= Ta5d6ff"Ta5d6ffcompletedTa5d6ff"

Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffInvalid data received, ignoring resourceTa5d6ff"Tb4b4b4)
Te6edf3resource_status Tff7b72= Ta5d6ff"Ta5d6ffinvalid_dataTa5d6ff"

Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffResource failedTa5d6ff"Tb4b4b4)
Te6edf3resource_status Tff7b72= Ta5d6ff"Ta5d6fffailedTa5d6ff"

Te6edf3resource_resolved Tff7b72= Tff7b72True

Te6edf3linkTff7b72.Td2a8ffset_resource_strategyTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACCEPT_ALLTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_started_callbackTb4b4b4(Te6edf3fetch_resource_startedTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_resource_concluded_callbackTb4b4b4(Te6edf3fetch_resource_concludedTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffrequestTb4b4b4(Ta5d6ff"Ta5d6fffetch_fileTa5d6ff"Tb4b4b4, Te6edf3dataTff7b72=Te6edf3fileTb4b4b4, Te6edf3response_callbackTff7b72=Te6edf3request_responseTb4b4b4, Te6edf3failed_callbackTff7b72=Te6edf3request_failedTb4b4b4)

Te6edf3syms Tff7b72= Ta5d6ff"Ta5d6ffβ’„β’‚β’β‘β‘ˆβ‘β‘ Ta5d6ff"
Tff7b72while Tff7b72not Te6edf3request_resolvedTb4b4b4:
Tff7b72if Tff7b72not Te6edf3silentTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tffa657printTb4b4b4(Tb4b4b4(Ta5d6ff"Tffea00\bTffea00\bTa5d6ff"Tff7b72+Te6edf3symsTb4b4b4[Te6edf3iTb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3i Tff7b72= Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72%Tffa657lenTb4b4b4(Te6edf3symsTb4b4b4)

Tff7b72if Te6edf3request_status Tff7b72== Ta5d6ff"Ta5d6fffetch_not_allowedTa5d6ff"Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3silentTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffFetch request failed, fetching the file Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3fileTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff was not allowed by the remoteTa5d6ff"Tb4b4b4)
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.15Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72elif Te6edf3request_status Tff7b72== Ta5d6ff"Ta5d6ffnot_foundTa5d6ff"Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3silentTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffFetch request failed, the file Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3fileTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff was not found on the remoteTa5d6ff"Tb4b4b4)
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.15Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72elif Te6edf3request_status Tff7b72== Ta5d6ff"Ta5d6ffremote_errorTa5d6ff"Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3silentTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffFetch request failed due to an error on the remote systemTa5d6ff"Tb4b4b4)
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.15Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72elif Te6edf3request_status Tff7b72== Ta5d6ff"Ta5d6ffunknownTa5d6ff"Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3silentTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffFetch request failed due to an unknown error (probably not authorised)Ta5d6ff"Tb4b4b4)
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.15Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72elif Te6edf3request_status Tff7b72== Ta5d6ff"Ta5d6fffoundTa5d6ff"Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3silentTb4b4b4: Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)

Tff7b72while Tff7b72not Te6edf3resource_resolvedTb4b4b4:
Tff7b72if Tff7b72not Te6edf3silentTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tff7b72if Te6edf3current_resourceTb4b4b4:
Te6edf3prg Tff7b72= Te6edf3current_resourceTff7b72.Td2a8ffget_progressTb4b4b4(Tb4b4b4)
Te6edf3percent Tff7b72= Tffa657roundTb4b4b4(Te6edf3prg Tff7b72* T79c0ff100.0Tb4b4b4, T79c0ff1Tb4b4b4)
Te6edf3stat_str Tff7b72= Tffa657strTb4b4b4(Te6edf3percentTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff - Ta5d6ff" Tff7b72+ Te6edf3size_strTb4b4b4(Tffa657intTb4b4b4(Te6edf3prgTff7b72*Te6edf3current_resourceTff7b72.Td2a8fftotal_sizeTb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff of Ta5d6ff" Tff7b72+ Te6edf3size_strTb4b4b4(Te6edf3current_resourceTff7b72.Td2a8fftotal_sizeTb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff - Ta5d6ff" Tff7b72+Te6edf3size_strTb4b4b4(Te6edf3speedTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffpsTa5d6ff"
Tff7b72if Te6edf3prg Tff7b72!= T79c0ff1.0Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffTransferring file Ta5d6ff"Tff7b72+Te6edf3symsTb4b4b4[Te6edf3iTb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72+Te6edf3stat_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffTransfer complete Ta5d6ff"Tff7b72+Te6edf3stat_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffWaiting for transfer to start Ta5d6ff"Tff7b72+Te6edf3symsTb4b4b4[Te6edf3iTb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3i Tff7b72= Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72%Tffa657lenTb4b4b4(Te6edf3symsTb4b4b4)

Tff7b72if Te6edf3current_resourceTff7b72.Td2a8ffstatus Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Tff7b72if Te6edf3silentTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffThe transfer failedTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffThe transfer failedTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3silentTb4b4b4:
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3fileTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff fetched from Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e#print("\r \r"+str(file)+" fetched from "+RNS.prettyhexrep(destination_hash))
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3fileTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff fetched from Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.15Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)

Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)


Tff7b72def Td2a8ffsendTb4b4b4(Te6edf3configdirTb4b4b4, Te6edf3verbosity Tff7b72= T79c0ff0Tb4b4b4, Te6edf3quietness Tff7b72= T79c0ff0Tb4b4b4, Te6edf3destination Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3file Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3timeout Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffPATH_REQUEST_TIMEOUTTb4b4b4, Te6edf3silentTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72global Te6edf3current_resourceTb4b4b4, Te6edf3resource_doneTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3speed
Tff7b72from T7ee787tempfile Tff7b72import Te6edf3TemporaryFile
Te6edf3targetloglevel Tff7b72= T79c0ff3Tff7b72+Te6edf3verbosityTff7b72-Te6edf3quietness

Tff7b72tryTb4b4b4:
Te6edf3dest_len Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Tff7b72if Tffa657lenTb4b4b4(Te6edf3destinationTb4b4b4) Tff7b72!= Te6edf3dest_lenTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffAllowed destination length is invalid, must be Tffd700{hex}Ta5d6ff hexadecimal characters (Tffd700{byte}Ta5d6ff bytes).Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tffa657hexTff7b72=Te6edf3dest_lenTb4b4b4, Te6edf3byteTff7b72=Te6edf3dest_lenTff7b72/Tff7b72/T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3destination_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3destinationTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination entered. Check your input.Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)

Te6edf3file_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3fileTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3file_pathTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffFile not foundTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)

Te6edf3temp_file Tff7b72= Te6edf3TemporaryFileTb4b4b4(Tb4b4b4)
Te6edf3real_file Tff7b72= Tffa657openTb4b4b4(Te6edf3file_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Te6edf3filename_bytes Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffbasenameTb4b4b4(Te6edf3file_pathTb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3filename_len Tff7b72= Tffa657lenTb4b4b4(Te6edf3filename_bytesTb4b4b4)

Tff7b72if Te6edf3filename_len Tff7b72> T79c0ff0xFFFFTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffFilename exceeds max size, cannot sendTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPreparing file...Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)

Te6edf3temp_fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3filename_lenTff7b72.Td2a8ffto_bytesTb4b4b4(T79c0ff2Tb4b4b4, Ta5d6ff"Ta5d6ffbigTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3temp_fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3filename_bytesTb4b4b4)
Te6edf3temp_fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3real_fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3temp_fileTff7b72.Td2a8ffseekTb4b4b4(T79c0ff0Tb4b4b4)

Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)

Te6edf3reticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdirTff7b72=Te6edf3configdirTb4b4b4, Te6edf3loglevelTff7b72=Te6edf3targetloglevelTb4b4b4)

Te6edf3identity_path Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffidentitypathTff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Te6edf3APP_NAME
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3identity_pathTb4b4b4)Tb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3identity_pathTb4b4b4)
Tff7b72if Te6edf3identity Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load identity for rncp. The identity file at Tffea00\"Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3identity_pathTb4b4b4)Tff7b72+Ta5d6ff"Tffea00\"Ta5d6ff may be corrupt or unreadable.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff2Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3identity Tff7b72= Tff7b72None

Tff7b72if Te6edf3identity Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo valid saved identity found, creating new...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4)
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3identityTff7b72.Td2a8ffto_fileTb4b4b4(Te6edf3identity_pathTb4b4b4)

Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Te6edf3silentTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPath to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff requestedTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPath to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff requested Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)

Te6edf3i Tff7b72= T79c0ff0
Te6edf3syms Tff7b72= Ta5d6ff"Ta5d6ffβ’„β’‚β’β‘β‘ˆβ‘β‘ Ta5d6ff"
Te6edf3estab_timeout Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72+Te6edf3timeout
Tff7b72while Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4) Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3estab_timeoutTb4b4b4:
Tff7b72if Tff7b72not Te6edf3silentTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tffa657printTb4b4b4(Tb4b4b4(Ta5d6ff"Tffea00\bTffea00\bTa5d6ff"Tff7b72+Te6edf3symsTb4b4b4[Te6edf3iTb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3i Tff7b72= Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72%Tffa657lenTb4b4b4(Te6edf3symsTb4b4b4)

Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3silentTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPath not foundTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffPath not foundTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3silentTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffEstablishing link with Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffEstablishing link with Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)

Te6edf3receiver_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3receiver_destination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(
Te6edf3receiver_identityTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4,
Te6edf3APP_NAMETb4b4b4,
Ta5d6ff"Ta5d6ffreceiveTa5d6ff"
Tb4b4b4)

Te6edf3link Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Te6edf3receiver_destinationTb4b4b4)
Tff7b72while Te6edf3linkTff7b72.Td2a8ffstatus Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVE Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3estab_timeoutTb4b4b4:
Tff7b72if Tff7b72not Te6edf3silentTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tffa657printTb4b4b4(Tb4b4b4(Ta5d6ff"Tffea00\bTffea00\bTa5d6ff"Tff7b72+Te6edf3symsTb4b4b4[Te6edf3iTb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3i Tff7b72= Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72%Tffa657lenTb4b4b4(Te6edf3symsTb4b4b4)

Tff7b72if Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Te6edf3estab_timeoutTb4b4b4:
Tff7b72if Te6edf3silentTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffLink establishment with Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff timed outTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffLink establishment with Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff timed outTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elif Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3silentTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffNo path found to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffNo path found to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3silentTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffAdvertising file resource...Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffAdvertising file resource Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)

Te6edf3linkTff7b72.Td2a8ffidentifyTb4b4b4(Te6edf3identityTb4b4b4)
Te6edf3resource Tff7b72= Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Te6edf3temp_fileTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3callback Tff7b72= Te6edf3sender_progressTb4b4b4, Te6edf3progress_callback Tff7b72= Te6edf3sender_progressTb4b4b4)
Te6edf3current_resource Tff7b72= Te6edf3resource

Tff7b72while Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72< Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffTRANSFERRINGTb4b4b4:
Tff7b72if Tff7b72not Te6edf3silentTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tffa657printTb4b4b4(Tb4b4b4(Ta5d6ff"Tffea00\bTffea00\bTa5d6ff"Tff7b72+Te6edf3symsTb4b4b4[Te6edf3iTb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3i Tff7b72= Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72%Tffa657lenTb4b4b4(Te6edf3symsTb4b4b4)

Tff7b72if Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72> Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Tff7b72if Te6edf3silentTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffFile was not accepted by Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffFile was not accepted by Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3silentTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffTransferring file...Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffTransferring file Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)

Tff7b72def Td2a8ffprogress_updateTb4b4b4(Te6edf3iTb4b4b4, Te6edf3doneTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Te6edf3prg Tff7b72= Te6edf3current_resourceTff7b72.Td2a8ffget_progressTb4b4b4(Tb4b4b4)
Te6edf3percent Tff7b72= Tffa657roundTb4b4b4(Te6edf3prg Tff7b72* T79c0ff100.0Tb4b4b4, T79c0ff1Tb4b4b4)
Te6edf3stat_str Tff7b72= Tffa657strTb4b4b4(Te6edf3percentTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff - Ta5d6ff" Tff7b72+ Te6edf3size_strTb4b4b4(Tffa657intTb4b4b4(Te6edf3prgTff7b72*Te6edf3current_resourceTff7b72.Td2a8fftotal_sizeTb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff of Ta5d6ff" Tff7b72+ Te6edf3size_strTb4b4b4(Te6edf3current_resourceTff7b72.Td2a8fftotal_sizeTb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff - Ta5d6ff" Tff7b72+Te6edf3size_strTb4b4b4(Te6edf3speedTb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ffpsTa5d6ff"
Tff7b72if Tff7b72not Te6edf3doneTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffTransferring file Ta5d6ff"Tff7b72+Te6edf3symsTb4b4b4[Te6edf3iTb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72+Te6edf3stat_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffTransfer complete Ta5d6ff"Tff7b72+Te6edf3stat_strTb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3i Tff7b72= Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72%Tffa657lenTb4b4b4(Te6edf3symsTb4b4b4)
Tff7b72return Te6edf3i

Tff7b72while Tff7b72not Te6edf3resource_doneTb4b4b4:
Tff7b72if Tff7b72not Te6edf3silentTb4b4b4:
Te6edf3i Tff7b72= Te6edf3progress_updateTb4b4b4(Te6edf3iTb4b4b4)

Tff7b72if Tff7b72not Te6edf3silentTb4b4b4:
Te6edf3i Tff7b72= Te6edf3progress_updateTb4b4b4(Te6edf3iTb4b4b4, Te6edf3doneTff7b72=Tff7b72TrueTb4b4b4)

Tff7b72if Te6edf3current_resourceTff7b72.Td2a8ffstatus Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Tff7b72if Te6edf3silentTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffThe transfer failedTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffThe transfer failedTa5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3silentTb4b4b4:
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3file_pathTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff copied to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# print("\r \r"+str(file_path)+" copied to "+RNS.prettyhexrep(destination_hash))
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3file_pathTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff copied to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.25Tb4b4b4)
Te6edf3real_fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3temp_fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3exitTb4b4b4(T79c0ff0Tb4b4b4)

Tff7b72def Td2a8ffmainTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3parser Tff7b72= Te6edf3argparseTff7b72.Td2a8ffArgumentParserTb4b4b4(Te6edf3descriptionTff7b72=Ta5d6ff"Ta5d6ffReticulum File Transfer UtilityTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6fffileTa5d6ff"Tb4b4b4, Te6edf3nargsTff7b72=Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6fffile to be transferredTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ffdestinationTa5d6ff"Tb4b4b4, Te6edf3nargsTff7b72=Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffhexadecimal hash of the receiverTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--configTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffpath to alternative Reticulum config directoryTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff-vTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff--verboseTa5d6ff'Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffcountTa5d6ff'Tb4b4b4, Te6edf3defaultTff7b72=T79c0ff0Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffincrease verbosityTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff-qTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff--quietTa5d6ff'Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffcountTa5d6ff'Tb4b4b4, Te6edf3defaultTff7b72=T79c0ff0Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffdecrease verbosityTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-STa5d6ff"Tb4b4b4, Ta5d6ff'Ta5d6ff--silentTa5d6ff'Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffstore_trueTa5d6ff'Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffdisable transfer progress outputTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-lTa5d6ff"Tb4b4b4, Ta5d6ff'Ta5d6ff--listenTa5d6ff'Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffstore_trueTa5d6ff'Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6fflisten for incoming transfer requestsTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-FTa5d6ff"Tb4b4b4, Ta5d6ff'Ta5d6ff--allow-fetchTa5d6ff'Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffstore_trueTa5d6ff'Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffallow authenticated clients to fetch filesTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-fTa5d6ff"Tb4b4b4, Ta5d6ff'Ta5d6ff--fetchTa5d6ff'Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffstore_trueTa5d6ff'Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6fffetch file from remote listener instead of sendingTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-jTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--jailTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffrestrict fetch requests to specified pathTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-bTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffstoreTa5d6ff'Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffsecondsTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72-T79c0ff1Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffannounce interval, 0 to only announce at startupTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657intTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff-aTa5d6ff'Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffallowed_hashTa5d6ff"Tb4b4b4, Te6edf3destTff7b72=Ta5d6ff"Ta5d6ffallowedTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffappendTa5d6ff'Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffallow this identityTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff-nTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff--no-authTa5d6ff'Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffstore_trueTa5d6ff'Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffaccept requests from anyoneTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff-pTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff--print-identityTa5d6ff'Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffstore_trueTa5d6ff'Tb4b4b4, Te6edf3defaultTff7b72=Tff7b72FalseTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffprint identity and destination info and exitTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff-wTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4, Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffsecondsTa5d6ff"Tb4b4b4, Tffa657typeTff7b72=Tffa657floatTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffsender timeout before giving upTa5d6ff"Tb4b4b4, Te6edf3defaultTff7b72=Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffPATH_REQUEST_TIMEOUTTb4b4b4)
T8b949e# parser.add_argument("--limit", action="store", metavar="files", type=float, help="maximum number of files to accept", default=None)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--versionTa5d6ff"Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4, Te6edf3versionTff7b72=Ta5d6ff"Ta5d6ffrncp Tffd700{version}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3versionTff7b72=Te6edf3__version__Tb4b4b4)Tb4b4b4)
Te6edf3args Tff7b72= Te6edf3parserTff7b72.Td2a8ffparse_argsTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3argsTff7b72.Td2a8fflisten Tff7b72or Te6edf3argsTff7b72.Td2a8ffprint_identityTb4b4b4:
Te6edf3listenTb4b4b4(
Te6edf3configdir Tff7b72= Te6edf3argsTff7b72.Td2a8ffconfigTb4b4b4,
Te6edf3verbosityTff7b72=Te6edf3argsTff7b72.Td2a8ffverboseTb4b4b4,
Te6edf3quietnessTff7b72=Te6edf3argsTff7b72.Td2a8ffquietTb4b4b4,
Te6edf3allowed Tff7b72= Te6edf3argsTff7b72.Td2a8ffallowedTb4b4b4,
Te6edf3fetch_allowed Tff7b72= Te6edf3argsTff7b72.Td2a8ffallow_fetchTb4b4b4,
Te6edf3jail Tff7b72= Te6edf3argsTff7b72.Td2a8ffjailTb4b4b4,
Te6edf3display_identityTff7b72=Te6edf3argsTff7b72.Td2a8ffprint_identityTb4b4b4,
T8b949e# limit=args.limit,
Te6edf3disable_authTff7b72=Te6edf3argsTff7b72.Td2a8ffno_authTb4b4b4,
Te6edf3announceTff7b72=Te6edf3argsTff7b72.Td2a8ffbTb4b4b4,
Tb4b4b4)

Tff7b72elif Te6edf3argsTff7b72.Td2a8fffetchTb4b4b4:
Tff7b72if Te6edf3argsTff7b72.Td2a8ffdestination Tff7b72!= Tff7b72None Tff7b72and Te6edf3argsTff7b72.Td2a8fffile Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3fetchTb4b4b4(
Te6edf3configdir Tff7b72= Te6edf3argsTff7b72.Td2a8ffconfigTb4b4b4,
Te6edf3verbosity Tff7b72= Te6edf3argsTff7b72.Td2a8ffverboseTb4b4b4,
Te6edf3quietness Tff7b72= Te6edf3argsTff7b72.Td2a8ffquietTb4b4b4,
Te6edf3destination Tff7b72= Te6edf3argsTff7b72.Td2a8ffdestinationTb4b4b4,
Te6edf3file Tff7b72= Te6edf3argsTff7b72.Td2a8fffileTb4b4b4,
Te6edf3timeout Tff7b72= Te6edf3argsTff7b72.Td2a8ffwTb4b4b4,
Te6edf3silent Tff7b72= Te6edf3argsTff7b72.Td2a8ffsilentTb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffprint_helpTb4b4b4(Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)

Tff7b72elif Te6edf3argsTff7b72.Td2a8ffdestination Tff7b72!= Tff7b72None Tff7b72and Te6edf3argsTff7b72.Td2a8fffile Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3sendTb4b4b4(
Te6edf3configdir Tff7b72= Te6edf3argsTff7b72.Td2a8ffconfigTb4b4b4,
Te6edf3verbosity Tff7b72= Te6edf3argsTff7b72.Td2a8ffverboseTb4b4b4,
Te6edf3quietness Tff7b72= Te6edf3argsTff7b72.Td2a8ffquietTb4b4b4,
Te6edf3destination Tff7b72= Te6edf3argsTff7b72.Td2a8ffdestinationTb4b4b4,
Te6edf3file Tff7b72= Te6edf3argsTff7b72.Td2a8fffileTb4b4b4,
Te6edf3timeout Tff7b72= Te6edf3argsTff7b72.Td2a8ffwTb4b4b4,
Te6edf3silent Tff7b72= Te6edf3argsTff7b72.Td2a8ffsilentTb4b4b4,
Tb4b4b4)

Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffprint_helpTb4b4b4(Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)

Tff7b72except Tf85149KeyboardInterruptTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3resource Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3resourceTff7b72.Td2a8ffcancelTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3link Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3exitTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffsize_strTb4b4b4(Te6edf3numTb4b4b4, Te6edf3suffixTff7b72=Ta5d6ff'Ta5d6ffBTa5d6ff'Tb4b4b4)Tb4b4b4:
Te6edf3units Tff7b72= Tb4b4b4[Ta5d6ff'Ta5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffKTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffMTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffGTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffTTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffPTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffETa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffZTa5d6ff'Tb4b4b4]
Te6edf3last_unit Tff7b72= Ta5d6ff'Ta5d6ffYTa5d6ff'

Tff7b72if Te6edf3suffix Tff7b72== Ta5d6ff'Ta5d6ffbTa5d6ff'Tb4b4b4:
Te6edf3num Tff7b72*Tff7b72= T79c0ff8
Te6edf3units Tff7b72= Tb4b4b4[Ta5d6ff'Ta5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffKTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffMTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffGTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffTTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffPTa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffETa5d6ff'Tb4b4b4,Ta5d6ff'Ta5d6ffZTa5d6ff'Tb4b4b4]
Te6edf3last_unit Tff7b72= Ta5d6ff'Ta5d6ffYTa5d6ff'

Tff7b72for Te6edf3unit Tff7b72in Te6edf3unitsTb4b4b4:
Tff7b72if Tffa657absTb4b4b4(Te6edf3numTb4b4b4) Tff7b72< T79c0ff1000.0Tb4b4b4:
Tff7b72if Te6edf3unit Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Tff7b72return Ta5d6ff"Tffd700%.0fTa5d6ff Tffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3unitTb4b4b4, Te6edf3suffixTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6ff"Tffd700%.2fTa5d6ff Tffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3unitTb4b4b4, Te6edf3suffixTb4b4b4)
Te6edf3num Tff7b72/Tff7b72= T79c0ff1000.0

Tff7b72return Ta5d6ff"Tffd700%.2fTffd700%sTffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Te6edf3numTb4b4b4, Te6edf3last_unitTb4b4b4, Te6edf3suffixTb4b4b4)

Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Te6edf3mainTb4b4b4(Tb4b4b4)

Served by rngit 1.5.2 - Generated in 0.19s